package letcode.oneQuestionPerDay._202004._23;

/**
 * @Description: 硬币
 * @Date: 2020/4/23
 * @Author: 许群星
 */
public class Coin {
    public static void main(String[] args) {
        int a = 5;
        System.out.println(waysToChange(a));
    }

    //提供方法  官方题解：动态规划
    public static int waysToChange(int n) {
        int[] coins = {25, 10, 5, 1};
        int mod=1000000007;
        int[] dp=new int[n+1];
        dp[0]=1;
        for (int i = 0; i < 4; i++) {
            int coin=coins[i];
            for (int j = coin; j <=  n; j++) {
                dp[j]=(dp[j]+dp[j-coin])%mod;
            }
        }
        return dp[n];
    }
}
/*
面试题 08.11. 硬币
硬币。给定数量不限的硬币，币值为25分、10分、5分和1分，编写代码计算n分有几种表示法。(结果可能会很大，你需要将结果模上1000000007)

示例1:

 输入: n = 5
 输出：2
 解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1
示例2:

 输入: n = 10
 输出：4
 解释: 有四种方式可以凑成总金额:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
说明：

注意:

你可以假设：

0 <= n (总金额) <= 1000000
 */